<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    数组扁平化: 取出嵌套数组(多维)中的所有元素放到一个新数组(一维)中
      如: [1, [3, [2, 4]]]  ==>  [1, 3, 2, 4]

      [1, [2, 3], [4, [5, [6, 7]]]]
    */
    const arr = [1, [2, 3], [4, [5, [6, 7]]]]
    // const arr = [4, [6, 7]]

    /* 
    方法一: 递归 + reduce() + concat() + some()
    */
    function flatten(arr) {
      return arr.reduce((pre, item) => {
        // item是二维数组, 先将item处理成一维数组
        // 二维数组: 至少有一个元素是数组
        if (Array.isArray(item) && item.some(cItem => Array.isArray(cItem))) {
          // 先将item处理成一维数组
          item = flatten(item)
          // return pre.concat(flatten(item))
        }
        // 如果item是一个一维数组, 可以
        return pre.concat(item)
      }, [])
    }
    // console.log(flatten(arr))

    /* 
    方法二: ... + some() + concat()
      [4, [6, 7]]   [].cancat(4, [6, 7]) ==> [4, 6, 7]
      [1, [2, 3], [4, [5, [6, 7]]]]
    */
    function flatten2 (arr) {

      // 如果 arr是二维或以上的数组
      while(arr.some(item => Array.isArray(item))) {
        // 就将arr降低一级
        arr = [].concat(...arr)
      }

      return  arr
   }
   console.log(flatten2(arr))
    
  </script>
</body>
</html>